package cn.tedu.tmall.admin.mall.service.impl;

import cn.tedu.tmall.admin.mall.dao.persist.repository.ICategoryRepository;
import cn.tedu.tmall.admin.mall.pojo.entity.Category;
import cn.tedu.tmall.admin.mall.pojo.param.CategoryAddNewParam;
import cn.tedu.tmall.admin.mall.pojo.vo.CategoryListItemVO;
import cn.tedu.tmall.admin.mall.pojo.vo.CategoryStandardVO;
import cn.tedu.tmall.admin.mall.service.ICategoryService;
import cn.tedu.tmall.common.enumerator.ServiceCode;
import cn.tedu.tmall.common.ex.ServiceException;
import cn.tedu.tmall.common.pojo.vo.PageData;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class CategoryServiceImpl implements ICategoryService {

    @Autowired
    private ICategoryRepository categoryRepository;

    @Override
    public void addNew(CategoryAddNewParam categoryAddNewParam) {
        // 在ICategoryRepository中添加抽象方法：CategoryStandardVO getStandardById(Long id);
        // 在CategoryRepositoryImpl中通过调用Mapper对象的方法，实现以上方法
        // 从当前方法的参数中取出parentId（声明成局部变量，后续还需要多次使用）
        Long parentId = categoryAddNewParam.getParentId();
        CategoryStandardVO parentCategory = null;
        // 判断parentId是否不为0
        if (parentId != 0) {
            // 是：调用Repository对象的getStandardById()方法执行查询，传入的参数就是parentId
            parentCategory = categoryRepository.getStandardById(parentId);
            // 判断查询结果是否为null
            if (parentCategory == null) {
                // 是：抛出异常（暂时抛出RuntimeException）
                throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, "新增类别失败，父级类别不存在！");
            }
            // 判断父级类别的enable是否不为1
            if (parentCategory.getEnable() != 1) {
                // 是：抛出异常（暂时抛出RuntimeException）
                throw new ServiceException(ServiceCode.ERROR_CONFLICT, "新增类别失败，父级类别已经被禁用！");
            }
        }

        // 在ICategoryRepository添加抽象方法：int countByName(String name);
        // 在CategoryRepositoryImpl中实现以上方法：直接调用MyBatis Plus的selectCount(wrapper)方法
        // -- 以上调用方法的参数可以 wrapper.eq("name", name);
        // 在当前方法中，调用Repository对象的countByName()方法
        int countByName = categoryRepository.countByName(categoryAddNewParam.getName());
        // 判断以上统计结果是否大于0
        if (countByName > 0) {
            // 是：抛出异常
            throw new ServiceException(ServiceCode.ERROR_CONFLICT, "新增类别失败，类别名称已经被占用！");
        }

        Category category = new Category();
        BeanUtils.copyProperties(categoryAddNewParam, category);
        // 向category中补全属性值：depth, isParent
        Integer depth = 1;
        if (parentId != 0) {
            depth = parentCategory.getDepth() + 1;
        }
        category.setDepth(depth);
        category.setIsParent(0);
        int rows = categoryRepository.insert(category);
        if (rows != 1) {
            throw new ServiceException(ServiceCode.ERROR_INSERT, "新增类别失败，服务器忙，请稍后再试！");
        }

        // "".substring(10000); // StringIndexOutOfBoundsException

        // 【如果本次添加的是某个类别的子级类别，可能需要将父级类别的isParent修改为1】
        // 在ICategoryRepository添加抽象方法：int updateById(Category category);
        // 在CategoryRepositoryImpl中实现以上方法
        // 判断parentId是否不为0，且父级类别的isParent不为1
        if (parentId != 0 && parentCategory.getIsParent() != 1) {
            // -- 调用Repository对象的方法，将父级类别的isParent更新为1
            Category updateParentCategory = new Category();
            updateParentCategory.setId(parentId);
            updateParentCategory.setIsParent(1);
            rows = categoryRepository.updateById(updateParentCategory);
            if (rows != 1) {
                throw new ServiceException(ServiceCode.ERROR_UPDATE, "新增类别失败，服务器忙，请稍后再试！");
            }
        }
    }

    @Override
    public CategoryStandardVO getStandardById(Long id) {
        CategoryStandardVO queryResult = categoryRepository.getStandardById(id);
        if (queryResult == null) {
            String message = "查询类别详情失败，尝试访问的数据不存在！";
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        return queryResult;
    }

    @Override
    public PageData<CategoryListItemVO> listByParent(Long parentId, Integer pageNum, Integer pageSize) {
        return categoryRepository.listByParent(parentId, pageNum, pageSize);
    }

}
